"""
全局配置管理模块

负责加载和管理主程序全局配置文件，包含任务并发数等全局设置。
"""

import os
import logging
import tomllib
from pathlib import Path
from typing import Dict, Any, Optional, Union


class GlobalConfigManager:
    """全局配置管理器"""
    
    def __init__(self, config_file: str = "/etc/database-backup/db.toml"):
        """初始化全局配置管理器
        
        参数:
            config_file (str): 全局配置文件路径
                示例值: "/etc/database-backup/db.toml"
        """
        self.config_file = Path(config_file)
        self.logger = self._setup_logging()
        self.config = self._load_config()
    
    def _setup_logging(self) -> logging.Logger:
        """设置日志记录器
        
        返回:
            logging.Logger: 配置好的日志记录器
        """
        logger = logging.getLogger("database_backup.global_config")
        if not logger.handlers:
            handler = logging.StreamHandler()
            formatter = logging.Formatter(
                '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
            )
            handler.setFormatter(formatter)
            logger.addHandler(handler)
            logger.setLevel(logging.INFO)
        return logger
    
    def _load_config(self) -> Dict[str, Any]:
        """加载全局配置文件
        
        返回:
            Dict[str, Any]: 全局配置信息
        """
        default_config = {
            'max_workers': 4,
            'config_dir': '/etc/database-backup/conf.d/',
            'log_level': 'INFO',
            'backup_dir': '/var/backups/database',
            'retention_days': 30,
            'loop_interval': 3600  # 循环间隔时间（秒），默认1小时
        }
        
        # 如果配置文件不存在，返回默认配置
        if not self.config_file.exists():
            self.logger.warning(f"全局配置文件不存在: {self.config_file}，使用默认配置")
            return default_config
        
        try:
            with open(self.config_file, 'rb') as f:  # tomllib需要二进制模式
                config = tomllib.load(f)
            
            # 合并默认配置和用户配置
            for key, value in default_config.items():
                if key not in config:
                    config[key] = value
            
            self.logger.info(f"成功加载全局配置文件: {self.config_file}")
            return config
            
        except Exception as e:
            self.logger.error(f"加载全局配置文件失败 {self.config_file}: {e}，使用默认配置")
            return default_config
    
    def get_max_workers(self) -> int:
        """获取最大工作线程数
        
        返回:
            int: 最大工作线程数
        """
        return self.config.get('max_workers', 4)
    
    def get_config_dir(self) -> str:
        """获取数据库配置文件目录
        
        返回:
            str: 配置文件目录路径
        """
        return self.config.get('config_dir', '/etc/database-backup/conf.d/')
    
    def get_log_level(self) -> str:
        """获取日志级别
        
        返回:
            str: 日志级别
        """
        return self.config.get('log_level', 'INFO')
    
    def get_backup_dir(self) -> str:
        """获取备份目录
        
        返回:
            str: 备份目录路径
        """
        return self.config.get('backup_dir', '/var/backups/database')
    
    def get_retention_days(self) -> int:
        """获取备份保留天数
        
        返回:
            int: 备份保留天数
        """
        return self.config.get('retention_days', 30)
    
    def get_loop_interval(self) -> int:
        """获取循环间隔时间
        
        返回:
            int: 循环间隔时间（秒）
        """
        return self.config.get('loop_interval', 3600)
    
    def get_all_config(self) -> Dict[str, Any]:
        """获取所有配置
        
        返回:
            Dict[str, Any]: 所有配置信息
        """
        return self.config.copy()
    
    def generate_default_config(self, output_path: Optional[str] = None) -> bool:
        """生成默认全局配置文件
        
        参数:
            output_path (Optional[str]): 输出文件路径
        
        返回:
            bool: 是否成功生成
        """
        if output_path is None:
            output_path = self.config_file
        
        default_config = {
            'max_workers': 4,
            'config_dir': '/etc/database-backup/conf.d/',
            'log_level': 'INFO',
            'backup_dir': '/var/backups/database',
            'retention_days': 30,
            'loop_interval': 3600  # 循环间隔时间（秒），默认1小时
        }
        
        try:
            output_path = Path(output_path)
            output_path.parent.mkdir(parents=True, exist_ok=True)
            
            # 使用tomllib写入配置文件
            # 注意：Python 3.11+的tomllib只提供读取功能，不提供写入功能
            # 我们需要手动实现TOML格式的写入
            with open(output_path, 'w', encoding='utf-8') as f:
                f.write("# Database Backup Global Configuration\n")
                f.write("# Generated by database-backup tool\n\n")
                
                for key, value in default_config.items():
                    if isinstance(value, str):
                        f.write(f'{key} = "{value}"\n')
                    elif isinstance(value, bool):
                        f.write(f'{key} = {str(value).lower()}\n')
                    else:
                        f.write(f'{key} = {value}\n')
            
            self.logger.info(f"默认全局配置文件已生成: {output_path}")
            return True
            
        except Exception as e:
            self.logger.error(f"生成默认全局配置文件失败: {e}")
            return False
    
    def config_exists(self) -> bool:
        """检查配置文件是否存在
        
        返回:
            bool: 配置文件是否存在
        """
        return self.config_file.exists()


def create_global_config(config_file: Optional[str] = None) -> GlobalConfigManager:
    """创建全局配置实例
    
    参数:
        config_file (Optional[str]): 全局配置文件路径
    
    返回:
        GlobalConfigManager: 全局配置实例
    """
    if config_file is None:
        config_file = "/etc/database-backup/db.toml"
    
    return GlobalConfigManager(config_file)